<?php namespace nimo\domains\master\batch\accounting;

use DateTime;
use nimo\common\csv\CsvConverter;

class EdinetAccountConverter implements CsvConverter {

    public static $CSV_COLUMNS = array(
        '科目分類',
        '標準ラベル（日本語）',
        '冗長ラベル（日本語）',
        '用途別ラベル（日本語）',
        '業種ラベル（日本語）',
        '連結',
        '四半期個別',
        '四半期連結',
        '中間個別',
        '中間連結',
        '標準ラベル（英語）',
        '用途別ラベル（英語）',
        '業種ラベル（英語）',
        '名前空間プレフィックス',
        '要素名',
        'type',
        'enumerations',
        'substitutionGroup',
        'periodType',
        'balance',
        'abstract',
        'nillable',
        'depth',
    );

    protected static $GROUP_NAME = array(
        'BalanceSheetsAbstract',                            // 貸借対照表
        'AssetsAbstract',                                   //   資産の部
        'CurrentAssetsAbstract',                            //     流動資産
        'NoncurrentAssetsAbstract',                         //     固定資産
        'PropertyPlantAndEquipmentAbstract',                //       有形固定資産
        'IntangibleAssetsAbstract',                         //       無形固定資産
        'DeferredAssetsAbstract',                           //     繰延資産
        'LiabilitiesAbstract',                              //   負債の部
        'CurrentLiabilitiesAbstract',                       //     流動負債
        'NoncurrentLiabilitiesAbstract',                    //     固定負債
        'NetAssetsAbstract',                                //   純資産の部
        'ShareholdersEquityAbstract',                       //     株主資本
        'ValuationAndTranslationAdjustmentsAbstract',       //     評価・換算差額等

        'StatementsOfIncomeAbstract',                       // 損益計算書
        'RevenueFromOperatingActivitiesAbstract',           //   営業活動による収益
        'COSAndExpensesFromOperatingActivitiesAbstract',    //   営業活動による費用・売上原価
        'GrossProfit',                                      //   売上総利益
        'SellingGeneralAndAdministrativeExpensesAbstract',  //   販売費及び一般管理費
        'NonOperatingIncomeAbstract',                       //   営業外収益
        'NonOperatingExpensesAbstract',                     //   営業外費用
        'ExtraordinaryIncomeAbstract',                      //   特別利益
        'ExtraordinaryLossAbstract',                        //   特別損失
        'IncomeTaxes',                                      //   法人税等
        'OtherComprehensiveIncomeAbstract',                 //   その他の包括利益
    );

    protected $configs;
    protected $csv_columns;
    protected $csv_index;
    protected $csv_depth;

    public function __construct($configs = array()) {
        $this->configs=$configs;
        $this->csv_depth = isset($configs['csv_depth']) ? $configs['csv_depth'] : 'depth';
        $this->set_csv_columns(self::$CSV_COLUMNS);
    }

    public function set_csv_columns($csv_columns) {
        $this->csv_columns=$csv_columns;
        $this->csv_index = array();
        foreach ($this->csv_columns as $k => $v) {
            $this->csv_index[$v] = $k;
        }
    }

    public function index($column) {
        return $this->csv_index[$column];
    }

    public function getfield_by_name($fields, $name) {
        return $fields[$this->csv_index[$column]];
    }

    public function depth($csv) {
        return $csv[$this->index($this->csv_depth)]; 
    }

    public function validate($csv) {
    	$ind = $this->index('depth');
        return isset($csv[$ind]) ? is_numeric($csv[$ind]) : false;
    }

    public function is_group($fields) {
        $ind = $this->index('要素名');
        return in_array($fields[$ind], self::$GROUP_NAME);
    }

    private $check_nameid = array(
        'InterestAndDividendsIncomeReceivedOpeCFInvCF' => 0,
        'InterestExpensesPaidOpeCFFinCF' => 0,
    );

    protected function checked_nameid($fields) {
        $nameid = $fields[$this->index('要素名')];        
        /*
        $depth = $fields[$this->index('depth')];
        $nameid_depth  = $nameid.':'.$depth;
        if (isset($this->check_nameid[$nameid_depth])) {
            $this->check_nameid[$nameid_depth]++;
            $nameid = $nameid.'-'.$this->check_nameid[$nameid_depth];
        } else {
            $this->check_nameid[$nameid_depth] = 1;
        }
        */
        if (isset($this->check_nameid[$nameid])) {
            $c = $this->check_nameid[$nameid]++;
            if ($c > 0) {
                return $nameid.'-'.$c;
            }
        }
        return $nameid;
    }

    public function convert($fields) {
        return array(
            'class'       => $fields[$this->index('科目分類')], 
            'name'        => $fields[$this->index('標準ラベル（日本語）')], 
            'lname'       => $fields[$this->index('冗長ラベル（日本語）')], 
            'uname'       => $fields[$this->index('用途別ラベル（日本語）')], 
            'ename'       => $fields[$this->index('標準ラベル（英語）')], 
            'nameid'      => $this->checked_nameid($fields),
            'type'        => ($fields[$this->index('type')] == 'xbrli:monetaryItemType') ? 1 : 0,
            'balance'     => $fields[$this->index('balance')], 
            'abstract'    => ($fields[$this->index('abstract')] == 'true') ? 1 : 0,
            'nillable'    => ($fields[$this->index('nillable')] == 'true') ? 1 : 0,            
        );
    }
}
